package com.ilancuo.staticfinal;

/**
 * 这段代码好像让人觉得用final修饰之后，就不能在方法中更改变量i的值了。 殊不知，方法changeValue和main方法中的变量i根本就不是一个变量，
 * 因为java参数传递采用的是值传递
 * ，对于基本类型的变量，相当于直接将变量进行了拷贝。所以即使没有final修饰的情况下，在方法内部改变了变量i的值也不会影响方法外的i。
 * 
 * @author ilancuo
 * 
 */
public class Test {

	public static void main(String[] args) {
		MITest mTest = new MITest();
		int i = 0;
		mTest.changeValue(i);
	}
}

class MITest {
	void changeValue(int i) {//final int i 会报错
		i++;
	}
}

class MIITest {
	/**
	 * 运行这段代码就会发现输出结果为helloworld。
	 * 很显然，用final进行修饰并没有阻止在changeValue中改变buffer指向的对象的内容。
	 * 有人说假如把final去掉了，万一在changeValue中让buffer指向了其他对象怎么办。有这种想法的朋友可以自己动手写代码试一下这样的结果是什么，
	 * 如果把final去掉了，然后在changeValue中让buffer指向了其他对象，也不会影响到main方法中的buffer，原因在于java采用的是值传递，
	 * 对于引用变量，传递的是引用的值，也就是说让实参和形参同时指向了同一个对象，因此让形参重新指向另一个对象对实参并没有任何影响。
	 */
	void changeValue2(final StringBuffer buffer) {
		buffer.append("hello");
	}
}